CH03-openCV基础函数

1. openCV 的绘图函数

1.1 画直线

cv2.line(img, start_point, end_point, color, thickness =0)

参数 说明
img 需要画的图像
start_point 直线的开头,必须是一个元组
end_point 直线的结尾,必须是一个元组
color 直线的颜色,必须是一个元组
thickness 直线的宽度
img = cv2.imread('./img/ch03-1.jpg')
img = cv2.line(img, (10,10), (100,100), (0,0,255), 2)
cv2.imshow("img",img)
cv2.waitKey(0)
cv2.destroyAllWindows()

1.2 画矩形

cv2.rectangle(img, point1, point2, color, thickness = 0)

参数 说明
img 需要画的图像
point1 矩形左上角的点的坐标,必须是一个元组
point2 矩形右下角的点的坐标,必须是一个元组
color 直线的颜色,必须是一个元组
thickness 直线的宽度
img = cv2.imread('./img/ch03-1.jpg')
img = cv2.rectangle(img,(10,10), (100,100), (255,0,0), 4)
cv2.imshow('img',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

实例 01:

img = np.zeros((512,512,3),np.uint8)  # 创建一个黑色的画布,大小为 512X512 像素,通道数为 3
flag = 1

while flag:
    for i in range(0,256):
        cv2.rectangle(img,(0,0), (150,128), (i, 255-i, i), 3)
        cv2.rectangle(img, (350, 0), (500, 128), (i, 255 - i, i), 3)
        cv2.rectangle(img, (0, 350), (150, 478), (i, 255 - i, i), 3)
        cv2.rectangle(img, (350, 350), (500, 478), (i, 255 - i, i), 3)
        cv2.rectangle(img, (165, 180), (315, 308), (i, 255 - i, i), 3)
        cv2.namedWindow('image',cv2.WINDOW_NORMAL)
        cv2.resizeWindow('image',(1000,1000))
        cv2.imshow('image',img)
        if cv2.waitKey(1) == ord('q'):
            flag -= 1
            break
cv2.destroyAllWindows()

1.3 画圆

cv2.cicle(img, center, R, color, thickness = 0)

参数 说明
img 需要画的图像
center 圆心坐标,必须是一个元组
R 圆的半径
color 直线的颜色,必须是一个元组
thickness 直线的宽度,如果是-1,会变成向内填充
img = cv2.imread('./img/ch03-1.jpg')
img = cv2.circle(img, (200,200), 100, (0,0,255),-1)
cv2.imshow('img',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

1.4 画椭圆

cv2.ellipse(img, center, (a,b), direction, angle_start, angle_end, color, thickness = 0)

参数 说明
img 需要画的图像
center 椭圆圆心坐标,必须是一个元组
(a,b) 椭圆的长轴和短轴
direction 按照顺时针方向旋转椭圆的角度
angle_start 画椭圆开始的角度
angle_stop 画椭圆结束的角度
color 直线的颜色,必须是一个元组
thickness 直线的宽度,如果是-1,会变成向内填充
img = cv2.imread('./img/ch03-1.jpg')
img = cv2.ellipse(img,(150,150),(100,80),25,30,210,(0,255,0),-1)
cv2.imshow('img',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

1.5 画多边形

cv2.polylines(img, pts, isClosed, color, thickness = 0)

参数 说明
img 需要画的图像
pts 点的集合,以列表形式填入
isClosed 多边形是否闭合,False:不闭合,True:闭合
color 直线的颜色,必须是一个元组
thickness 直线的宽度,如果是-1,会变成向内填充
img = np.zeros((256,256,3), np.uint8)  # 创建一个大小为 256X256像素,三通道的黑色画布

pts = np.array([[10,3],[48,19],[60,3],[98,19]],np.int32)  # 注意,格式必须是 np.int32
pts = pts.reshape((-1,1,2))

cv2.polylines(img, [pts], True, (0,255,255), 2)

cv2.imshow('img',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

1.6 添加文字

cv2.putText(img, text, org, fontFace, fontScale, color, thickness = 0, lineType = 0)

参数 说明
img 需要添加文字的背景图
text 添加的文字
org 添加文字的位置
fontFace 字体
fontScale 字体大小
color 字的颜色
thickness 线条的宽度
lineType 线条的种类
img = np.zeros((512,512,3),np.uint8)
font = cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(img, 'python-openCV', (10,40), font, 1, (255,255,100),2,cv2.LINE_AA)

cv2.namedWindow('image',cv2.WINDOW_NORMAL)
cv2.resizeWindow('image',750,750)
cv2.imshow('image',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

2. 处理鼠标事件函数

cv2.setMouseCallback(img, onMouse)

参数 说明
img 要绑定画面的名字
onMouse 响应函数,即当鼠标事件触发时调用的函数

cv2.setMouseCallback('image',draw_circle)

2.1 鼠标事件

参数 说明
EVENT_FLAG_ALTKEY 按 alt 键不放
EVENT_FLAG_CTRLKEY 按 ctrl 键不放
EVENT_FLAG_LBUTTON 左键拖拽
EVENT_FLAG_MBUTTON 中键拖拽
EVENT_FLAG_RBUTTON 右键拖拽
EVENT_FLAG_SHIFTKEY 按 shift 键不放
EVENT_LBUTTONDBLCLK 左键双击
EVENT_LBUTTONDOWN 左键单击
EVENT_LBUTTONUP 左键释放
EVENT_MBUTTONDBLCLK 中键双击
EVENT_MBUTTONDOWN 中键单击
EVENT_MBUTTONUP 中键释放
EVENT_MOUSEMOVE 滑动
EVENT_RBUTTONDBLCLK 右键双击
EVENT_RBUTTONDOWN 右键单击
EVENT_RBUTTONUP 右键释放
def draw_circle(event, x, y, flags, param):
    if event == cv2.EVENT_LBUTTONDBLCLK:
        cv2.circle(img, (x,y), 100, (255,0,0), -1)


img = np.zeros((500,500,3), np.uint8)
cv2.namedWindow('image')
cv2.setMouseCallback('image', draw_circle)

while True:
    cv2.imshow('image',img)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cv2.destroyAllWindows()

3. 滑动条式调色板实例

cv2.creatTrackbar(Track_name, img, min, max, TrackBarCallback)

参数 说明
Track_name 滑动条的名字
img 滑动条所在的画布
min 滑动条的最小值
max 滑动条的最大值
TrackBarCallback 滑动条的回调函数

cv2.getTrackbarPos(Track_name, img)

参数 说明
Track_name 滑动条的名字
img 滑动条所在的画布

返回值是滑动条当前所在的位置

img = np.zeros((300, 512, 3), np.uint8)
cv2.namedWindow('image')
cv2.createTrackbar('R', 'image', 0, 255)
cv2.createTrackbar('G', 'image', 0, 255)
cv2.createTrackbar('B', 'image', 0, 255)
switch = '0:OFF \n 1:ON'
cv2.createTrackbar(switch, 'image', 0, 1)

while 1:
    cv2.imshow('image', img)
    k = cv2.waitKey(1)
    if k == ord('q'):
        break

    r = cv2.getTrackbarPos('R', 'image')
    g = cv2.getTrackbarPos('G', 'image')
    b = cv2.getTrackbarPos('B', 'image')
    s = cv2.getTrackbarPos(switch, 'image')
    if s == 0:
        img[:] = 0
    else:
        img[:] = [r, g, b]

cv2.destroyAllWindows()